#pragma once
#include <iostream>
#include <vector>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <thread>
#include <atomic>
#include <unordered_map>
#include <string>
#include <utility>
#include <random>
#include <ctime>
#include <mutex>  // 互斥锁头文件

class EchoClient {
public:
    EchoClient(const char* ip, const std::vector<int>& ports, int numConnections, int maxEchoCount = 3);
    ~EchoClient();
    bool init();
    void start();

private:
    void createConnections();
    void createConnectionsThread(int threadId, int totalThreads);  // 多线程创建连接
    void eventLoop();
    int connectToServer(int connId);
    void setNonBlocking(int fd);
    bool checkConnectSuccess(int fd);
    int recvAll(int fd, char* buffer, int expectedLen);
    std::string generateTestData(int connId, int echoCount);

    std::string ip_;
    std::vector<int> ports_;
    int numConnections_;
    int epollFd_;
    std::atomic<int> connected_{0};       // 成功连接数
    std::atomic<int> completed_{0};       // 完成交互数
    std::atomic<int> failedConnections_{0}; // 失败连接数
    const int maxEchoCount_;
    std::unordered_map<int, time_t> connCreateTime_;  // fd -> 创建时间
    std::unordered_map<int, std::pair<std::string, int>> connState_;  // fd -> (发送数据, 交互次数)
    std::mt19937 rng_;
    const std::string charSet_;
    std::mutex connMutex_;  // 保护共享数据的互斥锁
    static const int MAX_EVENTS = 65535;
    static const int BUFFER_SIZE = 8192;
    static const int CONN_TIMEOUT_SEC = 5;   // 单个连接超时
    static const int THREAD_NUM = 4;         // 连接创建线程数
};